package com.sise.Stack;

import java.util.Deque;
import java.util.LinkedList;

/**
 *      剑指 Offer 31. 栈的压入、弹出序列
 *
 *      输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
 *      例如，序列 {1,2,3,4,5} 是某栈的压栈序列，序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列，
 *      但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
 *
 *      输入：pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
 *      输出：true
 *      解释：我们可以按以下顺序执行：
 *      push(1), push(2), push(3), push(4), pop() -> 4,
 *      push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
 */
public class _offer_31_validateStackSequences {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Deque<Integer> stack = new LinkedList();            // 创建一个辅助栈，模拟出入栈的过程，如果最终为 空，就说明可以
        int popIndex = 0;
        for (int num : pushed){
            stack.push(num);                                // num 入栈
            while (!stack.isEmpty() && stack.peek() == popped[popIndex]){   // 判断当前入栈的元素 与 出栈元素进行对比，如果相同，那就说明现在可以出栈。这里采用的是 while，一次性可以出栈多个
                stack.pop();
                popIndex++;
            }
        }
        return stack.isEmpty();    // 当所有的出入栈元素都遍历完成，那么就 判断辅助栈中是否还有元素，如果还有，那就说明出栈不够彻底，存在问题
    }
}
